#include <iostream>
using namespace std;

// 在C++17以后，编译期默认启用RVO（Return Value Optimization），不会对函数返回的局部变量值进行拷贝，直接在函数调用处进行构造，只要满足以下两个条件其一：
// URVO（Unnamed Return Value Optimization）：函数的各分支都返回同一个类型的匿名变量。
// NRVO（Named Return Value Optimization）：函数的各分支都返回同一个非匿名变量。
class MyClass {
public:
    MyClass() { cout << "Constructor called!" << endl; }
    MyClass(const MyClass&) { cout << "Copy Constructor called!" << endl; }
    MyClass(MyClass&&) noexcept { cout << "Move Constructor called!" << endl; }
    ~MyClass() { cout << "Destructor called!" << endl; }
};

MyClass createObject() {
    MyClass obj;
    return obj;  // 这里进行RVO优化
}

int main() {
    MyClass obj = createObject();  // 期望RVO消除拷贝或移动
}

/*
Constructor called!
Destructor called!
*/
